const a: Array<string | number> = ['a', 'b'];
const b: Array<{ prop: string }> = [{ prop: 'a' }];
const c: Array<() => void> = [() => {}];
const d: MyType[] = ['a', 'b'];
const e: string[] = ['a', 'b'];
const f: readonly string[] = ['a', 'b'];

let a: number[] = [];
let a: Array<string | number> = [];
let a: readonly number[] = [];

let yy: number[][] = [[4, 5], [6]];

function fooFunction(foo: Array<ArrayClass<string>>) {
  return foo.map(e => e.foo);
}

function bazFunction(baz: Arr<ArrayClass<String>>) {
  return baz.map(e => e.baz);
}

let fooVar: Array<(c: number) => number>;

type fooUnion = Array<string | number | boolean>;

type fooIntersection = Array<string & number>;

namespace fooName {
  type BarType = { bar: string };
  type BazType<T> = Arr<T>;
}

interface FooInterface {
  '.bar': { baz: string[] };
}